import { tripartitewxToken, generate, ticketgetticket } from "@/api/index.js"; //为你提供timestamp、nonceStr、signature的后端接口
import jssdk from "weixin-js-sdk";

const APPID = "wx04a90c09644a39eb"; //公众号的appId（注意不是小程序的appid）

function generateRandomString(length) {
  const characters =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  let result = "";
  const charactersLength = characters.length;
  for (let i = 0; i < length; i++) {
    result += characters.charAt(Math.floor(Math.random() * charactersLength));
  }
  return result;
}

async function sha1Hash(str) {
  const buf = await crypto.subtle.digest(
    "SHA-1",
    new TextEncoder().encode(str)
  );
  return Array.from(new Uint8Array(buf))
    .map((b) => b.toString(16).padStart(2, "0"))
    .join("");
}

/**
 * 获取微信配置
 * @param {*} tag 调用页面的this
 * @returns
 */
export const wechatConfig = (tag) => {
  let wx_host = window.location.href.split("#")[0]; //后端获取签名，需要前端传url，url要求看注解
  console.log(wx_host);

  let t = Math.floor(new Date().getTime() / 1000);
  return new Promise((resolve, reject) => {
    tripartitewxToken().then((res) => {
      if (res.code == 200) {
        if (res.data) {
          let mydata = res.data;
          const accessToken = mydata.match(/accessToken=([^,]+)/)?.[1];
          const expiresIn = mydata.match(/expiresIn=([^\}]+)/)?.[1];

          //获取jsapi_ticket  access_token=ACCESS_TOKEN&type=jsapi
          ticketgetticket({ access_token: accessToken, type: "jsapi" }).then(
            async (res) => {
              console.log(res.data.ticket, "res.data.ticket");

              let json = {
                jsapi_ticket: res.data.ticket,
                noncestr: generateRandomString(10),
                timestamp: t,
                url: wx_host,
              };
              const string1 = `jsapi_ticket=${json.jsapi_ticket}&noncestr=${json.noncestr}&timestamp=${json.timestamp}&url=${json.url}`;
              const signature = await sha1Hash(string1);

              const config = {
                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
                appId: APPID, // 必填，公众号的唯一标识
                timestamp: json.timestamp, // 必填，生成签名的时间戳
                nonceStr: json.noncestr, // 必填，生成签名的随机串
                signature: signature, // 必填，签名
                jsApiList: [
                  "updateAppMessageShareData",
                  "updateTimelineShareData",
                  "scanQRCode",
                ], // 必填，需要使用的JS接口列表，注意查看官方文档，部分js接口即将废弃，我这里用的是新的
                openTagList: ["wx-open-launch-weapp"], // 可选，需要使用的开放标签列表（当前标签用于跳转微信小程序）
              };
              jssdk.config(config); //通过config接口注入权限验证配置
              jssdk.ready(function () {
                //通过ready接口处理成功验证
                console.log("js-sdk配置成功！");
                return resolve(true);
              });
              jssdk.error(function (res) {
                // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
                console.info("config信息验证失败");
                console.info(res);
                return reject(false);
              });

              // generate(json).then((d) => {
              //   // console.log(d, "wewewe");
              // });
            }
          );
        }
      }
    });
  });
};

/**
 * 调用微信扫一扫
 * @param {Object} tag - Vue组件实例（用于访问$wx）
 * @param {Object} options - 扫码配置
 *   @param {boolean} [options.needResult=true] - 是否返回扫码结果（默认直接跳转）
 *   @param {string[]} [options.scanType=["qrCode","barCode"]] - 扫码类型（二维码/条形码）
 *   @param {Function} onSuccess - 扫码成功回调
 *   @param {Function} onError - 扫码失败回调
 */
export const scanQRCode = (tag, options = {}) => {
  return new Promise((resolve, reject) => {
    // 确保已配置JS-SDK
    if (!jssdk) {
      console.error("微信JS-SDK未初始化");
      return reject("微信JS-SDK未初始化");
    }

    // 默认配置
    const defaultOptions = {
      needResult: true, // 默认返回结果
      scanType: ["qrCode", "barCode"], // 二维码和条形码
      ...options,
    };

    // 调用微信扫一扫接口
    jssdk.scanQRCode({
      needResult: defaultOptions.needResult,
      scanType: defaultOptions.scanType,
      success: (res) => {
        console.log("扫码成功:", res);
        if (defaultOptions.onSuccess) defaultOptions.onSuccess(res);
        resolve(res);
      },
      fail: (err) => {
        console.error("扫码失败:", err);
        if (defaultOptions.onError) defaultOptions.onError(err);
        reject(err);
      },
    });
  });
};
